home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
fs201q0
/
fs201q0.c
< prev
next >
Wrap
Text File
|
1993-07-08
|
30KB
|
1,397 lines
/* FMSC-201G -> Q0 Driver Copyright (c) E.Suto , 1992,1993 */
/* 修正履歴 Ver 0.00 1992/03/09 jx100q0 V1.50より試作版 */
/* Ver 0.01 1992/04/17 統合化 */
/* Ver 0.01+ 1992/04/24 高速テスト版 */
/* Ver 0.01x 1992/05/03 高速決定版 */
/* Ver 0.01y 1992/05/07 3回00(^^;他 */
/* Ver 0.01z 1992/07/03 後悔版(^^;他 */
/* Ver 0.02a 1992/12/02 高速化(^^;他 */
/* Ver 0.11 1993/01/18 それなり修正(^^; */
/* Ver 0.12 1993/02/22 自動で外部RS232C使用 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "register.h"
#define STX 0x02
#define CAN 0x18
#define ACK 0x06
#define NACK 0x15
#define ESC 0x1B
#define NULL_ 0x00
void cancel() ;
void copyright();
void cur_off() ;
void cur_on() ;
void fal_make() ;
void free_buff() ;
void get_buff() ;
void int_read() ;
void int_set() ;
void in_check() ;
void make_q0() ;
void modem_set() ;
void modem_reset() ;
void parm_set() ;
void pcheck() ;
void pre_in() ;
void pre_in2() ;
void read_back() ;
void read_plain(unsigned char *) ;
void rotation() ;
void rs232c_send(unsigned char) ;
void rs232c_receive(unsigned char *) ;
void rs232c_reset() ;
void rs232c_set(unsigned char) ;
void scan_init() ;
void send(int) ;
void usage() ;
void wait_ack() ;
int in_list() ;
int max_(int,int) ;
int pcheck_x() ;
int pcheck_y() ;
static short res_x = 100 ;/* 主走査線方向の解像度 */
static short res_y = 100 ;/* 副走査線方向の解像度 */
static short zoom_x = 100 ;/* 主走査線方向のズーム値 */
static short zoom_y = 100 ;/* 副走査線方向のズーム値 */
static short start_x = 0 ;/* 主走査線方向の始点 */
static short start_y = 0 ;/* 副走査線方向の始点 */
static short length_x = 400 ;/* 主走査線方向の長さ */
static short length_y = 640 ;/* 副走査線方向の長さ */
static short bright = 0 ;/* 明度指定 */
static short gamma = 1 ;/* 濃度補正 */
static short rotat = 0 ;/* 画像回転処理 */
static short fal = 1 ;/* FAL作成 */
static short debug = 0 ;/* 詳細情報表示 */
static unsigned char cmd[16] ;
static unsigned char *buffer ;
static unsigned char *br,*bg,*bb ;
static unsigned char name_q0[128],name_fal[128] ;
static unsigned char modem_select ;
static struct _rs232c_parm {
unsigned char mode ;
unsigned char rate ;
unsigned short data_addr_o ;
unsigned short data_addr_s ;
unsigned short send_timeout ;
unsigned short recive_timeout ;
unsigned long reserve0 ;
unsigned char reserve1 ;
unsigned char reserve2 ;
unsigned char reserve3 ;
} rs232c_parm ;
static struct _data_parm {
unsigned short length ;
unsigned short counter ;
unsigned short in ;
unsigned short out ;
unsigned char data[2048] ;
} data_parm ;
static unsigned int int_data ;
/* メイン */
main(int argc,char *argv[])
{
int i,k ;
char *c ;
unsigned char *p1 ;
strcpy( name_q0 , "" );
/* オプションのチェック */
if( argc < 2 ) {
pre_in() ;
}
else {
k = 0 ;
for( i=1 ; i<argc ; i++ ) {
c = argv[i] ;
if( *c == '-' || *c == '/' ) {
switch( *++c ) {
case 'r' :
case 'R' :
switch( *++c ) {
case 'o' :
case 'O' :
c++ ;
if( sscanf( c , "%d" , &rotat ) == EOF ||
( rotat != 0 &&
rotat != 1 &&
rotat != 2 &&
rotat != 3 ) )
goto perr ;
break ;
case 'x' :
case 'X' :
c++ ;
if( sscanf( c , "%d" , &res_x ) == EOF ||
res_x < 50 ||
res_x > 200 )
goto perr ;
break ;
case 'y' :
case 'Y' :
c++ ;
if( sscanf( c , "%d" , &res_y ) == EOF ||
res_y < 50 ||
res_y > 200 )
goto perr ;
break ;
default :
goto perr ;
}
break ;
case 'z' :
case 'Z' :
switch( *++c ) {
case 'x' :
case 'X' :
c++ ;
if( sscanf( c , "%d" , &zoom_x ) == EOF ||
zoom_x < 50 ||
zoom_x > 200 )
goto perr ;
break ;
case 'y' :
case 'Y' :
c++ ;
if( sscanf( c , "%d" , &zoom_y ) == EOF ||
zoom_y < 50 ||
zoom_y > 200 )
goto perr ;
break ;
default :
goto perr ;
}
break ;
case 's' :
case 'S' :
switch( *++c ) {
case 'x' :
case 'X' :
c++ ;
if( sscanf( c , "%d" , &start_x ) == EOF ||
start_x < 0 ||
start_x > 1592 )
goto perr ;
break ;
case 'y' :
case 'Y' :
c++ ;
if( sscanf( c , "%d" , &start_y ) == EOF ||
start_y < 0 ||
start_y > 2559 )
goto perr ;
break ;
default :
goto perr ;
}
break ;
case 'l' :
case 'L' :
switch( *++c ) {
case 'x' :
case 'X' :
c++ ;
if( sscanf( c , "%d" , &length_x ) == EOF ||
length_x < 8 ||
length_x > 800 ||
length_x % 8 != 0 )
goto perr ;
break ;
case 'y' :
case 'Y' :
c++ ;
if( sscanf( c , "%d" , &length_y ) == EOF ||
length_y < 1 ||
length_y > 1280 )
goto perr ;
break ;
default :
goto perr ;
}
break ;
case 'b' :
case 'B' :
c++ ;
if( sscanf( c , "%d" , &bright ) == EOF ||
bright < -3 ||
(bright > 3 && bright < 253 ) ||
bright > 255 )
goto perr ;
break ;
case 'g' :
case 'G' :
c++ ;
if( sscanf( c , "%d" , &gamma ) == EOF ||
( gamma != 1 &&
gamma != 2 &&
gamma != 0 &&
gamma != 16 &&
gamma != 32 ) )
goto perr ;
break ;
case 'f' :
case 'F' :
c++ ;
if( sscanf( c , "%d" , &fal ) == EOF ||
( fal != 1 &&
fal != 0 ) )
goto perr ;
break ;
case 'i' :
case 'I' :
debug = -1 ;
break ;
case 'h' :
case 'H' :
copyright() ;
usage() ;
exit( 0 ) ;
break ;
default :
goto perr ;
}
}
else {
if( k ) {
perr: printf( "パラメタ(%s)の指定が間違っています。\n" , argv[i] ) ;
exit( -1 ) ;
}
strcpy( name_q0 , argv[i] ) ;
k = -1 ;
}
}
if( k == 0 ) {
if( debug ) {
pre_in();
}
else{
printf( "ファイル名が指定されてません。" ) ;
exit( -1 ) ;
}
}
/* パラメタの関連チェック */
pcheck() ;
}
/* 対話入力 */
while( in_list() == 1 ) {
in_check() ;
}
/* ファイル名の切りだし */
strcpy( name_fal , name_q0 ) ;
if( ( p1 = strrchr( name_fal , '.' ) ) != NULL ) {
if( strlen( p1 ) > 4 ) {
strcat( name_q0 , ".q0" ) ;
strcat( name_fal , ".fal" ) ;
}
strcpy( p1 , ".fal" ) ;
}
else {
strcat( name_q0 , ".q0" ) ;
strcat( name_fal , ".fal" ) ;
}
/* 領域の獲得 */
get_buff() ;
/* 各種パラメタの設定 */
parm_set() ;
printf( "\nただいまより、読み込みを開始します。しばらくお待ち下さい。\n" ) ;
/* 緑画面の読込 */
if( debug )
printf( "緑画面を読み込みます。\n" ) ;
read_plain( bg ) ;
/* 赤画面の読込 */
if( debug )
printf( "赤画面を読み込みます。\n" ) ;
read_plain( br ) ;
/* 青画面の読込 */
if( debug )
printf( "青画面を読み込みます。\n" ) ;
read_plain( bb ) ;
printf( "\n" ) ;
if( debug )
printf( "1画面を読み込みました。\n" ) ;
/* RS232C状態戻し */
modem_reset() ;
/* Q0ファイル作成処理 */
if( rotat ) {
rotation() ;
}
else {
make_q0() ;
}
/* FALファイル作成処理 */
if( fal ) {
if( debug )
printf( "FALファイルを作成します。\n" ) ;
fal_make() ;
}
/* 出来上がり (^^; */
printf( "\nお待たせしました、Q0ファイルが完成しました。\n" ) ;
exit( 0 ) ;
}
/* 対話入力処理 */
void pre_in()
{
copyright() ;
printf( "\n" ) ;
printf(
"ファイル プレフィックス [ret: quit] = " ) ;
strcpy( name_q0 ,"" ) ;
gets( name_q0 ) ;
if( name_q0[0] == NULL_ ) {
usage() ;
exit( -1 ) ;
}
in_check() ;
}
/* 対話入力処理その2(^^; */
void pre_in2()
{
char indata[64] ;
printf(
"ファイル プレフィックス [ret:%8s] = ",
name_q0 ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
strcpy( name_q0 , indata ) ;
}
}
/* 対話入力チェック処理 */
void in_check()
{
int i ;
char indata[64] ;
in_rx:
i = 0 ;
do{
i++ ;
if( i > 1 ) {
res_x = 100 ;
}
printf(
"主走査線方向の解像度 {50-200 S1} [ret:%8d] = ",
res_x ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
copyright() ;
printf( "\n" ) ;
pre_in2() ;
goto in_rx ;
}
res_x = atoi( indata ) ;
}
} while( res_x > 200 || res_x < 50 ) ;
in_ry:
i = 0 ;
do{
i++ ;
if( i > 1 ) {
res_y = 100 ;
}
printf(
"副走査線方向の解像度 {50-200 S1} [ret:%8d] = ",
res_y ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
read_back() ;
goto in_rx ;
}
res_y = atoi( indata ) ;
}
} while( res_y > 200 || res_y < 50 ) ;
in_zx:
i = 0 ;
do{
i++ ;
if( i > 1 ) {
zoom_x = 100 ;
}
printf(
"主走査線方向のズーム値 {50-200 S1} [ret:%8d] = ",
zoom_x ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
read_back() ;
goto in_ry ;
}
zoom_x = atoi( indata ) ;
}
} while( zoom_x < 50 || zoom_x > 200 ) ;
in_zy:
i = 0 ;
do{
i++ ;
if( i > 1 ) {
zoom_y = 100 ;
}
printf(
"副走査線方向のズーム値 {50-200 S1} [ret:%8d] = ",
zoom_y ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
read_back() ;
goto in_zx ;
}
zoom_y = atoi( indata ) ;
}
} while( zoom_y < 50 || zoom_y > 200 ) ;
in_sx:
i = 0 ;
do{
i++ ;
if( i > 1 ) {
start_x = 0 ;
}
printf(
"主走査線方向の始点座標 {0-1592} [ret:%8d] = ",
start_x ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
read_back() ;
goto in_zy ;
}
start_x = atoi( indata ) ;
}
} while( start_x < 0 ||
start_x > 1592 ) ;
in_sy:
i = 0 ;
do{
i++ ;
if( i > 1 ) {
start_y = 0 ;
}
printf(
"副走査線方向の始点座標 {0-2559} [ret:%8d] = ",
start_y ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
read_back() ;
goto in_sx ;
}
start_y = atoi( indata ) ;
}
} while( start_y < 0 ||
start_y > 2559 ) ;
in_lx:
i = 0 ;
do{
i++ ;
if( i > 1 ) {
length_x = 400 ;
}
printf(
"主走査線方向の読取長 {8-800} [ret:%8d] = ",
length_x ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
read_back() ;
goto in_sy ;
}
length_x = atoi( indata ) ;
}
} while( length_x < 8 ||
length_x > 800 ||
length_x % 8 != 0 ||
pcheck_x() != 0 ) ;
in_ly:
i = 0 ;
do{
i++ ;
if( i > 1 ) {
length_y = 640 ;
}
printf(
"副走査線方向の読取長 {1-1280} [ret:%8d] = ",
length_y ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
read_back() ;
goto in_lx ;
}
length_y = atoi( indata ) ;
}
} while( length_y < 1 ||
length_y > 1280 ||
pcheck_y() != 0 ) ;
in_b:
i = 0 ;
do{
i++ ;
if( i > 1 ) {
bright = 0 ;
}
printf(
"原稿の明度 {3-0/255-253} [ret:%8d] = ",
bright ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
read_back() ;
goto in_ly ;
}
bright = atoi( indata ) ;
}
} while( bright < 0 ||
bright > 255 ||
( bright > 3 && bright < 253 ) ) ;
in_g:
i = 0 ;
do{
i++ ;
if( i > 1 ) {
gamma = 1 ;
}
printf(
"原稿の濃度補正 {0/1/2/16/32} [ret:%8d] = ",
gamma ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
read_back() ;
goto in_b ;
}
gamma = atoi( indata ) ;
}
} while( gamma != 0 &&
gamma != 1 &&
gamma != 2 &&
gamma != 16 &&
gamma != 32 ) ;
in_ro:
i = 0 ;
do{
i++ ;
if( i > 1 ) {
rotat = 0 ;
}
printf(
"画像の回転方向 {0:無/1:左/2:右/3:逆} [ret:%8d] = ",
rotat ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
read_back() ;
goto in_g ;
}
rotat = atoi( indata ) ;
}
} while( rotat != 0 &&
rotat != 1 &&
rotat != 2 &&
rotat != 3 ) ;
i = 0 ;
do{
i++ ;
if( i > 1 ) {
fal = 1 ;
}
printf(
"FALファイル作成 {1:スル/0:シナイ} [ret:%8d] = ",
fal ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( indata[0] != NULL_ ) {
if( indata[0] == '-' ) {
read_back() ;
goto in_ro ;
}
fal = atoi( indata ) ;
}
} while( fal != 0 &&
fal != 1 ) ;
}
/* 入力確認処理 */
int in_list()
{
int i ;
char indata[64] ;
i = 0 ;
copyright() ;
printf( "\n" ) ;
printf( " ファイル プレフィックス = %s\n",name_q0 ) ;
printf( " 主走査線方向の解像度 = %5d\n",res_x ) ;
printf( " 副走査線方向の解像度 = %5d\n",res_y ) ;
printf( " 主走査線方向のズーム値 = %5d\n",zoom_x ) ;
printf( " 副走査線方向のズーム値 = %5d\n",zoom_y ) ;
printf( " 主走査線方向の始点座標 = %5d\n",start_x ) ;
printf( " 副走査線方向の始点座標 = %5d\n",start_y ) ;
printf( " 主走査線方向の読取長 = %5d\n",length_x ) ;
printf( " 副走査線方向の読取長 = %5d\n",length_y ) ;
printf( " 原稿の明度 = %5d\n",bright ) ;
printf( " 原稿の濃度補正 = %5d\n",gamma ) ;
printf( " 画像の回転 {0:無/1:左/2:右/3:逆} = %5d\n",rotat ) ;
printf( " FALファイルの作成 {1:スル/0:シナイ} = %5d\n",fal ) ;
printf("\n") ;
printf(
"以上の設定でよろしいですか {y:yes/n:no/q:quit} [ret: y] =" ) ;
strcpy( indata ,"" ) ;
gets( indata ) ;
if( strcmp( indata , "n" ) == 0 ||
strcmp( indata , "N" ) == 0 ||
strcmp( indata , "no" ) == 0 ||
strcmp( indata , "NO" ) == 0 ) {
i = 1 ;
copyright() ;
printf( "\n" ) ;
pre_in2() ;
}
if( strcmp( indata , "q" ) == 0 ||
strcmp( indata , "Q" ) == 0 ||
strcmp( indata , "quit" ) == 0 ||
strcmp( indata , "QUIT" ) == 0 ) exit( -1 ) ;
return( i ) ;
}
/* 一行戻し処理(^^; */
void read_back()
{
printf( "\x1b[1A\x1b[2K\x1b[1A\x1b[2K" ) ;
}
/* BIOSよよる初期化 */
void rs232c_reset()
{
union REGS in_reg,out_reg ;
struct SREGS sreg ;
unsigned char c ;
unsigned int seg_addr,off_addr ;
/* 念のためRS232CのBIOSセット */
if( nativetoreal( &(data_parm) , sizeof(data_parm) ,
&seg_addr , &off_addr ) < 0 ) {
printf ( "リアルメモリの獲得に失敗しました。1\n" ) ;
exit( -1 ) ;
}
rs232c_parm.mode = 0x01 ;/* INT,non_flow,1bit,NONE,8bit */
rs232c_parm.rate = 0x05 ;/* 9600bps */
rs232c_parm.data_addr_o = off_addr ;/* 受信データバッファアドレス */
rs232c_parm.data_addr_s = seg_addr ;/* 受信データバッファアドレス */
rs232c_parm.send_timeout = 0 ;/* 送信タイムアウト時間 0.1秒 */
rs232c_parm.recive_timeout = 0 ;/* 受信タイムアウト時間 1秒 */
rs232c_parm.reserve0 = 0l ;/* りざーぶ(^^; */
rs232c_parm.reserve1 = 0 ;/* りざーぶ(^^; */
rs232c_parm.reserve2 = 0 ;/* りざーぶ(^^; */
rs232c_parm.reserve3 = 0 ;/* りざーぶ(^^; */
data_parm.length = 2000 ;/* 受信バッファ長 */
if( nativetoreal( &(rs232c_parm) , sizeof(rs232c_parm) ,
&seg_addr , &off_addr ) < 0 ) {
printf ( "リアルメモリの獲得に失敗しました。2\n" ) ;
exit( -1 ) ;
}
in_reg.h.ah = 0x03 ;
in_reg.h.al = 0x00 ;
in_reg.x.di = off_addr ;
segread( &sreg ) ;
sreg.ds = seg_addr ;
intreal( 0x9b, &in_reg, &out_reg, &sreg ) ;
if( out_reg.h.ah ) {
printf( "通信パラメタの設定に失敗しました。%d\n" , out_reg.h.ah ) ;
exit( -1 ) ;
}
segread( &sreg ) ;
in_reg.h.ah = 0x01 ;
in_reg.h.al = 0x00 ;
intreal( 0x9b, &in_reg, &out_reg, &sreg ) ;
if( out_reg.h.ah ) {
printf( "回線のオープンに失敗しました。%d\n" , out_reg.h.ah ) ;
exit( -1 ) ;
}
segread( &sreg ) ;
in_reg.h.ah = 0x02 ;
in_reg.h.al = 0x00 ;
intreal( 0x9b, &in_reg, &out_reg, &sreg ) ;
if( out_reg.h.ah ) {
printf( "回線のクローズに失敗しました。%d\n" , out_reg.h.ah ) ;
exit( -1 ) ;
}
}
/* 通信パラメタのセット 08:9600 / 04:19200 bps */
void rs232c_set( unsigned char speed )
{
RS_INIT() ;
OUTPB( 0x0056 , 0x76 ) ;
OUTPB( 0x0052 , speed ) ;
OUTPB( 0x0052 , 0x00 ) ;
}
/* 1バイト受信処理 */
void rs232c_receive(unsigned char *c)
{
int data ;
*c = RS_GETCH() ;
if( RS_STAT() & 0x00000038 ) {
printf( "受信処理に失敗しました。%.8X,%.8X\n" , data , *c ) ;
exit( -1 ) ;
}
}
/* 1バイト送信処理 */
void rs232c_send(unsigned char c)
{
RS_PUTCH( c ) ;
}
/* パラメタの相関関係チェック */
void pcheck()
{
if( pcheck_x() ) {
printf( "主走査(X軸)方向のサイズが読取範囲を超えています。\n" ) ;
exit( -1 ) ;
}
if( pcheck_y() ) {
printf( "副走査(Y軸)方向のサイズが読取範囲を超えています。\n" ) ;
exit( -1 ) ;
}
}
/* X軸の関係チェック */
int pcheck_x()
{
int m ;
m = ( 25 * (int)res_x * (int)zoom_x / 25 ) / 25 ;
if( ( start_x + length_x ) > m ) return( -1 ) ;
else return( 0 ) ;
}
/* Y軸の関係チェック */
int pcheck_y()
{
int m ;
m = ( 16 * 25 * (int)res_y * (int)zoom_y / 25 ) / 250 ;
if( ( start_y + length_y ) > m ) return( -1 ) ;
else return( 0 ) ;
}
/* 各種パラメタのセット */
void parm_set()
{
unsigned char data , temp ;
/* ボーレート指定 */
scan_init() ;
cmd[0] = ESC ;
cmd[1] = '$' ;
send( 2 ) ;
cmd[0] = 'I' ;
cmd[1] = 0x00 ; /* 19200bps */
send( 2 ) ;
/* データフォーマット指定 */
rs232c_set( 0x04 );
cmd[0] = ESC ;
cmd[1] = 'D' ;
send( 2 ) ;
cmd[0] = 8 ; /* 8ビット精度 */
send( 1 ) ;
/* 解像度指定 */
cmd[0] = ESC ;
cmd[1] = 'R' ;
send( 2 ) ;
cmd[0] = res_x & 0xFF ;
cmd[1] = (res_x >> 8) & 0xFF ;
cmd[2] = res_y & 0xFF ;
cmd[3] = (res_y >> 8) & 0xFF ;
send( 4 ) ;
/* ズーム率指定 */
cmd[0] = ESC ;
cmd[1] = 'H' ;
send( 2 ) ;
cmd[0] = zoom_x ;
cmd[1] = zoom_y ;
send( 2 ) ;
/* 読取領域指定 */
cmd[0] = ESC ;
cmd[1] = 'A' ;
send( 2 ) ;
cmd[0] = start_x & 0xFF ;
cmd[1] = (start_x >> 8) & 0xFF ;
cmd[2] = start_y & 0xFF ;
cmd[3] = (start_y >> 8) & 0xFF ;
cmd[4] = length_x & 0xFF ;
cmd[5] = (length_x >> 8) & 0xFF ;
cmd[6] = length_y & 0xFF ;
cmd[7] = (length_y >> 8) & 0xFF ;
send( 8 ) ;
/* 色指定 */
cmd[0] = ESC ;
cmd[1] = 'C' ;
send( 2 ) ;
cmd[0] = 1 ; /* カラー読込指定 */
send( 1 ) ;
/* 明度指定 */
cmd[0] = ESC ;
cmd[1] = 'L' ;
send( 2 ) ;
cmd[0] = bright ;
send( 1 ) ;
/* 濃度補正(γ補正)指定 */
cmd[0] = ESC ;
cmd[1] = 'Z' ;
send( 2 ) ;
cmd[0] = gamma ;
send( 1 ) ;
/* 中間調処理指定 */
cmd[0] = ESC ;
cmd[1] = 'B' ;
send( 2 ) ;
cmd[0] = 1 ; /* 中間調処理を行わない */
send( 1 ) ;
/* 読取開始 */
rs232c_send( ESC ) ;
rs232c_send( 'G' ) ;
if( debug ) printf( "読み取り動作を開始します。\n" ) ;
}
/* コマンドの送信処理 */
void send(int n)
{
int i ;
if( debug ) {
printf( "Send : " ) ;
for( i = 0 ; i < n ; i++ ) printf( "%.2X " , cmd[i] ) ;
printf( "\n" ) ;
}
for( i = 0 ; i < n ; i++ ) {
rs232c_send( cmd[i] ) ;
}
wait_ack() ;
}
/* ACK待ち処理 */
void wait_ack()
{
unsigned char data ;
rs232c_receive( &data ) ;
if( data != ACK ) {
printf( "否定応答を受信しました。%.2X\n" , data ) ;
exit( -1 ) ;
}
else {
if( debug ) printf( "Receive : ACK(%.2X).\n" , data ) ;
}
}
/* FALファイルの作成 */
void fal_make()
{
FILE *fp ;
short i ;
if( rotat > 0 && rotat < 3 ) {
i = length_x ;
length_x = length_y ;
length_y = i ;
}
if( (fp=fopen( name_fal , "wt" )) == NULL ) {
printf( "ファイル(%s)がオープンできません。\n" , name_fal ) ;
exit( -1 ) ;
}
fprintf( fp , "F_ALL(V1.00)\n" ) ;
fprintf( fp , "%5d %5d 0 0\n",length_x,length_y ) ;
fprintf( fp , " 1.00 255 255 255 0\n" ) ;
fclose( fp ) ;
}
/* Q0ファイルの作成 */
void make_q0()
{
int i,j,lx3 ;
FILE *fp ;
unsigned char *c,*r,*g,*b ;
printf( "Q0ファイルを作成しています。\n" ) ;
lx3 = length_x * 3 ;
if( (fp=fopen( name_q0 , "wb" )) == NULL ) {
printf( "ファイル(%s)がオープンできません。\n" , name_q0 ) ;
exit( -1 ) ;
}
r = br ;
g = bg ;
b = bb ;
for( i = 0 ; i < length_y ; i++ ) {
c = buffer ;
for( j = 0 ; j < length_x ; j++ ) {
*c++ = *r++ ;
*c++ = *g++ ;
*c++ = *b++ ;
}
if( fwrite( buffer , 1 , lx3 , fp ) != lx3 ) {
printf( "Q0ファイルの書き込みに失敗しました。\n" ) ;
exit( -1 ) ;
}
}
fclose( fp ) ;
}
/* 画像回転処理 */
void rotation()
{
int i,j,k,ly3,lx3 ;
FILE *fp ;
unsigned char *b0 ;
if( (fp=fopen( name_q0 , "wb" )) == NULL ) {
printf( "ファイル(%s)がオープンできません。\n" , name_q0 ) ;
exit( -1 ) ;
}
ly3 = (int)length_y * 3 ;
lx3 = (int)length_x * 3 ;
/* 左回転 */
switch( rotat ) {
case 1 :
for( i = length_x - 1 , k = 1 ; i >= 0 ; i-- , k++ ) {
printf( "ただいま (%4u) LINEを回転中です。\r", k ) ;
b0 = buffer ;
for( j = 0 ; j < length_y ; j++ ) {
*b0++ = br[ i + j * (int)length_x ] ;
*b0++ = bg[ i + j * (int)length_x ] ;
*b0++ = bb[ i + j * (int)length_x ] ;
}
if( fwrite( buffer , 1 , ly3 , fp ) != ly3 ) {
printf( "Q0ファイルの書き込みに失敗しました。\n" ) ;
exit( -1 ) ;
}
}
break ;
/* 右回転 */
case 2 :
for( i = 0 ; i < length_x ; i++ ) {
printf( "ただいま (%4u) LINEを回転中です。\r", i + 1 ) ;
b0 = buffer ;
for( j = length_y - 1 ; j >= 0 ; j-- ) {
*b0++ = br[ i + j * (int)length_x ] ;
*b0++ = bg[ i + j * (int)length_x ] ;
*b0++ = bb[ i + j * (int)length_x ] ;
}
if( fwrite( buffer , 1 , ly3 , fp ) != ly3 ) {
printf( "Q0ファイルの書き込みに失敗しました。\n" ) ;
exit( -1 ) ;
}
}
break ;
/* 逆回転 */
case 3 :
k = length_x * length_y ;
for( i = 0 ; i < length_y ; i++ ) {
printf( "ただいま (%4u) LINEを回転中です。\r", i + 1 ) ;
b0 = buffer ;
for( j = 0 ; j < length_x ; j++ ) {
k-- ;
*b0++ = br[ k ] ;
*b0++ = bg[ k ] ;
*b0++ = bb[ k ] ;
}
if( fwrite( buffer , 1 , lx3 , fp ) != lx3 ) {
printf( "Q0ファイルの書き込みに失敗しました。\n" ) ;
exit( -1 ) ;
}
}
break ;
}
printf( "\n" ) ;
fclose( fp ) ;
}
/* バッファ獲得 */
void get_buff()
{
if( ( ( br = malloc( length_x * length_y ) ) == NULL ) ||
( ( bg = malloc( length_x * length_y ) ) == NULL ) ||
( ( bb = malloc( length_x * length_y ) ) == NULL ) ||
( ( buffer = malloc( max_( (int)length_x * 3 , (int)length_y * 3 ) ) ) == NULL ) ) {
printf("\n 作業用に必要なメモリが不足しています。\n") ;
exit( -1 ) ;
}
}
/* バッファ解放 */
void free_buff()
{
free( br ) ;
free( bg ) ;
free( bb ) ;
free( buffer ) ;
}
/* 1プレーン読込 */
void read_plain(unsigned char *bx)
{
int i,j ;
unsigned char data , temp , head ;
int int_data_org ;
cur_off() ;
int_read() ;
int_data_org = int_data ;
int_data &= 0x00000000 ;
int_set() ;
int_data = int_data_org ;
j = 0 ;
for(;;){
/* STX待ち */
temp = RS_GETCH() ;
if( RS_STAT() & 0x00000038 ) {
int_set() ;
cur_on() ;
modem_reset() ;
printf( "STX(%d):受信処理に失敗しました。%.8X,%.8x\n",j,data,temp);
exit( -1 ) ;
}
/* ステータス読込 */
head = RS_GETCH() ;
if( RS_STAT() & 0x00000038 ) {
int_set() ;
cur_on() ;
modem_reset() ;
printf( "STA(%d):受信処理に失敗しました。%.8X,%.8x\n",j,data,temp);
exit( -1 ) ;
}
/* データ長読込 */
temp = RS_GETCH() ;
if( RS_STAT() & 0x00000038 ) {
int_set() ;
cur_on() ;
modem_reset() ;
printf( "LN1(%d):受信処理に失敗しました。%.8X,%.8x\n",j,data,temp);
exit( -1 ) ;
}
temp = RS_GETCH() ;
if( RS_STAT() & 0x00000038 ) {
int_set() ;
cur_on() ;
modem_reset() ;
printf( "LN2(%d):受信処理に失敗しました。%.8X,%.8x\n",j,data,temp);
exit( -1 ) ;
}
/* 画像データ読込 */
for( i = 0 ; i < length_x ; i++ ) {
*bx++ = RS_GETCH() ;
if( RS_STAT() & 0x00000038 ) {
int_set() ;
cur_on() ;
modem_reset() ;
printf( "X=%d,Y=%d:受信処理に失敗しました。%.8X\n",i,j,data ) ;
exit( -1 ) ;
}
}
j++ ;
if( ( head & 0x20) > 0 ) break ;
if( j > length_y ) break ;
rs232c_send( ACK ) ;
}
int_set() ;
cur_on() ;
if( !( head & 0x20 ) && ( j > length_y ) )
printf( "副走査線方向の読み取りで、内部矛盾が発生しました。\n" ) ;
if( ( head & 0x20 ) && ( j != length_y ) )
printf( "副走査線方向の読み取りで、内部矛盾が発生しました。\n" ) ;
if( debug )
printf( "1画面を読み込みました。\n" ) ;
}
/* 大きい方を返す(^^; */
int max_(int a,int b)
{
if( a > b ) return( a ) ;
else return( b ) ;
}
/* イニシャライズ */
void scan_init()
{
int data , i ;
modem_set() ;
rs232c_reset() ;
rs232c_set( 0x08 ) ; /* 9600 */
rs232c_send( ESC ) ;
rs232c_send( '@' ) ;
data = RS_GETCH() ;
if( RS_STAT() & 0x00000038 ) {
if( debug )
printf( "ボーレートは19200で設定されています。%.8X,%.8X\n"
,RS_STAT(),data ) ;
for( i = 0 ; i < 5000 ; i++ ) printf("\r") ; /* WAIT */
rs232c_set( 0x04 ) ; /* 19200 */
rs232c_send( ESC ) ;
rs232c_send( '@' ) ;
data = RS_GETCH() ;
if( RS_STAT() & 0x00000038 ) {
if( debug )
printf( "ボーレートがよくわからない(;_;)。 %.8X,%.8X\n"
,RS_STAT(),data ) ;
}
rs232c_set( 0x08 ) ; /* 9600 */
}
else {
if( debug ) printf( "ボーレートは9600で設定されています。\n" ) ;
}
for( i = 0 ; i < 5000 ; i++ ) printf("\r") ; /* WAIT */
}
/* CAN送信 */
void cancel()
{
if( debug ) printf( "Send CAN. \n" ) ;
rs232c_send( CAN ) ;
wait_ack() ;
}
/* 割り込み許可情報の読みだし */
void int_read()
{
union REGS in_reg,out_reg ;
struct SREGS sreg ;
unsigned int seg_addr,off_addr ;
if( nativetoreal( &(int_data) , sizeof(int_data) ,
&seg_addr , &off_addr ) < 0 ) {
printf ( "リアルメモリの獲得に失敗しました。1\n" ) ;
exit( -1 ) ;
}
in_reg.h.ah = 0x03 ;
in_reg.x.di = off_addr ;
segread( &sreg ) ;
sreg.ds = seg_addr ;
intreal( 0xae, &in_reg, &out_reg, &sreg ) ;
if( debug ) printf( "割り込み情報は(%.8X)\n" , int_data ) ;
}
/* 割り込み許可情報の書き込み */
void int_set()
{
union REGS in_reg,out_reg ;
struct SREGS sreg ;
unsigned int seg_addr,off_addr ;
if( nativetoreal( &(int_data) , sizeof(int_data) ,
&seg_addr , &off_addr ) < 0 ) {
printf ( "リアルメモリの獲得に失敗しました。1\n" ) ;
exit( -1 ) ;
}
if( debug ) printf( "割り込み情報は(%.8X)\n" , int_data ) ;
printf( " \r" ) ;
in_reg.h.ah = 0x02 ;
in_reg.x.di = off_addr ;
segread( &sreg ) ;
sreg.ds = seg_addr ;
intreal( 0xae, &in_reg, &out_reg, &sreg ) ;
}
/* カーソル非表示 */
void cur_off()
{
putchar( 0x1b ) ;
putchar( '[' ) ;
putchar( '1' ) ;
putchar( 'v' ) ;
}
/* カーソル表示 */
void cur_on()
{
putchar( 0x1b ) ;
putchar( '[' ) ;
putchar( '0' ) ;
putchar( 'v' ) ;
}
/* 外部RS232C選択 */
void modem_set()
{
modem_select = INPB( 0x0a0a ) & 0xc0 ;
OUTPB( 0x0a0a , 0x80 ) ;
}
/* RS232C選択の状態を戻す */
void modem_reset()
{
OUTPB( 0x0a0a , modem_select ) ;
}
/* 著作権表示 */
void copyright()
{
printf( "\x1b*" ) ;
printf(
"FMSC-201G -> Q0 Driver Ver 0.12 , Copyright (c) E.Suto ,1992-1993\n"
);
}
/* 使い方 */
void usage()
{
printf( "\n 使用法 : FS201Q0 [options] [file-path-prefix]\n\n" ) ;
printf( " options: オプション = 機能概略 [選択値] (省略値)\n" ) ;
printf(
" -rx数字 = 主走査線方向の解像度 [50-200 step 1] (100)\n" ) ;
printf(
" -ry数字 = 副走査線方向の解像度 [50-200 step 1] (100)\n" ) ;
printf(
" -zx数字 = 主走査線方向のズーム値 [50-200 step 1] (100)\n" ) ;
printf(
" -zy数字 = 副走査線方向のズーム値 [50-200 step 1] (100)\n" ) ;
printf(
" -sx数字 = 主走査線方向の読み取り始点[0-1592 step 1] ( 0)\n" ) ;
printf(
" -sy数字 = 副走査線方向の読み取り始点[0-2559 step 1] ( 0)\n" ) ;
printf(
" -lx数字 = 主走査線方向の読み取り長さ[8-800 step 8] (400)\n" ) ;
printf(
" -ly数字 = 副走査線方向の読み取り長さ[1-1280 step 1] (640)\n" ) ;
printf(
" -b数字 = 明度指定 [3-0/255-253] ( 0)\n" ) ;
printf(
" -g数字 = 濃度補正 [0/1/2/16/32] ( 1)\n" ) ;
printf(
" -ro数字 = 回転方向 [0:無/1:左/2:右/3:逆] ( 0)\n" ) ;
printf(
" -f数字 = FALファイル作成の有無 [0:無/1:有] ( 1)\n" ) ;
printf(
" -h = HELP(本メッセージ表示) \n" ) ;
}